
#include <iostream>
#include <ostream>
#include <stack>

// 递归：代码复用
// 打印 nums[start...end]
void printArr(int nums[], int n, int start) {
    // 退出条件
    if (start == n) return;
    // 第一步：打印 nums[start]
    std::cout << nums[start] << std::endl;
    // 第二步：打印 nums[start + 1...end]
    printArr(nums, n, start + 1);
}

// 迭代：显示栈模拟递归
// 空间复杂度：O(n)
void printArrIter(int nums[], int n) {
    // 定义显示栈，作用和系统栈是一样的
    std::stack<int> s;
    // 第一次调用 printArr
    s.push(0);
    while (!s.empty()) {
        int start = s.top();
        s.pop();
        // 退出条件
        if (start == n) return;
        // 第一步：打印第一个元素
        std::cout << nums[start] << std::endl;
        // 第二步：调用 printArr，打印 [start + 1...end]
        s.push(start + 1);
    }
}

int main() {
    int nums[4] = {1, 2, 3, 4};
    printArr(nums, 4, 0);
    printArrIter(nums, 4);
}